package chapter9;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 通配符下限匹配，总结通配符的匹配形式分为两种，第一种:
 * ? extends T，该匹配模式表示上限通配符匹配，使用上限通配符后，使用时对象的赋值方法不可用
 * 因为这种匹配方式下，编译器只是知道对象中应该保存T类型的数据，但是T到底是什么是无法确定的
 * 所以，这种匹配形式只能用于从对象中读取
 * 第二种：
 * ? super T，下限通配符匹配，和上边的相反，当从下限通配符匹配的对象中取数据时，编译器无法确定
 * 其类型，所以取出的数据都被当作Object来处理，而存入对象则不受影响，由于指定了下限，只要保存的
 * 对象是T类型或者其父类型都可以存入，而且Object是一切对象的父类，所以该种方式可以保存对象
 *
 * 通俗的解释可以参考知乎的这个问题的高赞回答：@see https://www.zhihu.com/question/20400700
 */
public class MyUtils {

    public static <T> T copy(Collection<? super T> dest, Collection<T> src) {
        T last = null;
        for(T ele : src) {
            last = ele;
            dest.add(last);
        }
        return last;
    }

    public static void main(String[] args) {
        List<Number> ln = new ArrayList<>();
        List<Integer> li = new ArrayList<>();
        li.add(5);
        Integer last = copy(ln, li);
        System.out.println(ln);
    }
}
